<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script type="text/javascript">
        // 变量提升 预处理
         /*
            js引擎在代码正式执行之前会做一个预处理的工作:
                1. 收集变量
                2. 收集函数
                依据:
                var 将var后面的变量定义但是不赋值 
                function(){} 提前定义该函数
         */

        console.log(username); // undefined
        var username='kobe';
        console.log(username);

        fun()// 正常执行
        function fun(){
            console.log('fun()');
        }

        // 执行上下文 执行上下文对象
        /*
            执行上下文(execute context) EC
            理解：代码执行的环境
            时机：代码正式执行之前会进入到执行环境
            工作：
                1.创建变量对象
                  -变量
                  -全局：window
                  -局部：抽象的但是确实存在
                  -函数及函数的参数
                2.确认this 的指向
                  -全局：this ---> window
                  -局部: this ---> 调用其的对象
                3.创建作用域链
                  -父级作用域链+当前的变量对象
                4.扩展:
                  ECObj={
                    变量对象：{变量，函数，函数的形参}
                    scopeChain:父级作用域链+当前的变量对象
                    this:{window || 调用其的对象}
                }
        */
    </script>
</body>
</html>